# -*- coding: utf-8 -*-
"""
@Time    : 2024/9/2 20:13 
@Author  : ZhangShenao 
@File    : 4.使用LangGraph实现ReACT架构的Agent.py 
@Desc    : 使用LangGraph实现ReACT架构的Agent

在LangGraph中除了能使用基础组件(节点、边、数据状态)来构建Agent智能体
这也是LangGraph自由性高的一个优点
我们还可以使用LangGraph预构建的代理来快速创建智能体
例如: ReACT智能体、工具调用智能体等
"""
import os

import dotenv
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
from langgraph.graph import MessagesState
from langgraph.prebuilt import create_react_agent

from dalle_image_tool import create_dalle_image_tool
from gaode_weather_tool import GaodeWeatherTool
from google_serper_tool import create_google_serper_tool

# 加载环境变量
dotenv.load_dotenv()

# 创建工具列表
tools = [GaodeWeatherTool(), create_dalle_image_tool(), create_google_serper_tool()]

# 创建LLM
llm = ChatOpenAI(model="gpt-4o-mini",
                 temperature=0,
                 openai_api_base=os.getenv("OPENAI_API_BASE"))

# 使用LangGraph的prebuild函数,创建预构建好的ReACT智能体
# 该函数封装了初始化Graph、创建Node和Edge和编译Graph等过程
# 最终返回一个编译好的CompiledGraph
# 它是一个Runnable可运行组件,可以直接调用
agent = create_react_agent(model=llm,  # 指定LLM模型
                           tools=tools,  # 指定工具列表
                           )

# 定义初始状态
init_state: MessagesState = {"messages": [HumanMessage(content="请帮我画一张英短蓝猫在沙发上睡觉的图片")]}

# 调用智能体,获取最终状态
final_state = agent.invoke(init_state)

print(type(final_state))

for msg in final_state["messages"]:
    print(f"消息内容: {msg.content}")
